package cn.hinglo.permission.controller;

import cn.hinglo.common.annotation.JsonBody;
import cn.hinglo.common.annotation.RequestMapping;
import cn.hinglo.common.config.base.BaseController;
import cn.hinglo.common.interceptors.request.Delete;
import cn.hinglo.common.interceptors.request.Get;
import cn.hinglo.common.interceptors.request.Post;
import cn.hinglo.common.interceptors.request.Put;
import cn.hinglo.permission.entity.AuthorizationRequest;
import cn.hinglo.permission.model.*;
import cn.hinglo.permission.service.PermissionService;
import cn.hinglo.permission.validator.AddUserValidator;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import com.jfinal.aop.Before;
import com.jfinal.aop.Inject;
import com.jfinal.core.paragetter.Para;
import lombok.extern.slf4j.Slf4j;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;


/**
 * @createTime: 2018/3/1
 * @author: HingLo
 * @description: 权限管理，主要是对权限，角色，进行管理
 */
@Slf4j
@RequestMapping("/sys")
public class PermissionController extends BaseController {

    @Inject
    private PermissionService permissionService;
    // *************************用户管理*************************

    /***
     * 查询系统全部用户
     * @param page 页码
     * @param pageSize 页码大小
     */
    @Before(Get.class)
    public void listUserRole(Integer page, Integer pageSize) {
        success(permissionService.listUserRoleService(getPage(page), getSize(pageSize)));
    }

    /***
     * 给用户授权指定的角色
     *
     * @param userId 用户id
     * @  返回授权结果
     */
    @Before(Post.class)
    public void addUserRole(Integer userId, String roleId) {
        long[] roles = StrUtil.splitToLong(roleId, ",");
        Set<Long> roleSet = new HashSet<>();
        for (long role : roles) {
            roleSet.add(role);
        }
        result(permissionService.addUserRoleService(userId, roleSet));
    }

    /**
     * 删除用户
     *
     * @param id 用户的唯一Id
     */
    @Before(Delete.class)
    public void deleteUser(String id) {
        result(permissionService.deleteUserService(id));

    }

    /***
     * 获取用户信息
     * @param id id
     */
    @Before(Get.class)
    public void getUser(String id) {
        success(permissionService.getUserService(id));
    }

    /***
     * 添加用户
     * @param user 用户信息
     */
    @Before({Post.class, AddUserValidator.class})
    public void addUser(@Para("") User user, String roleId) {
        result(permissionService.addUserService(user, roleId));
    }

    /***
     * 更新用户信息
     * @param user 用户信息
     */
    @Before({Put.class, AddUserValidator.class})
    public void updateUser(@Para("") User user) {
        result(permissionService.updateUserService(user));
    }

    /***
     * 账号状态处理
     * @param id id
     * @param status 状态
     */
    @Before({Put.class})
    public void updateUserStatus(Integer id, Integer status) {
        result(permissionService.updateUserStatus(id, status));
    }


    // *************************角色管理*************************

    /**
     * 角色列表
     */
    @Before(Get.class)
    public void listRole() {
        success(permissionService.listRoleListService());
    }

    /***
     * 添加角色
     *
     * @param role 角色对象
     */
    @Before(Post.class)
    public void addRole(@Para("") Role role) {
        result(permissionService.addRoleService(role), "添加失败");
    }

    /**
     * 删除角色
     *
     * @param id 角色的唯一Id
     */
    @Before(Delete.class)
    public void deleteRole(String id) {
        result(permissionService.deleteRoleService(id));

    }

    // *************************角色授权管理*************************

    /**
     * 查看角色的权限
     *
     * @param id 角色的唯一Id
     */
    @Before(Get.class)
    public void rolePermission(String id) {
        // 指定角色的Id
        success(permissionService.listRolePermissionService(id));
    }

    /**
     * 给指定的角色添加授权
     *
     * @param request 角色的唯一Id
     */
    @Before(Post.class)
    public void addRolePermission(@JsonBody @Para("") AuthorizationRequest request) {
        Set<Long> menuIdSet = new HashSet<>();
        Set<Long> permissionIdSet = new HashSet<>();
        Collections.addAll(menuIdSet, Convert.toLongArray(request.getMenuId().split(",")));
        Collections.addAll(permissionIdSet, Convert.toLongArray(request.getPermissionId().split(",")));

        success(permissionService.addRolePermissionService(menuIdSet, permissionIdSet, request.getRoleId()));
    }

    // *************************权限管理*************************

    /**
     * 浏览全部权限列表
     *
     * @ 返回二级果
     */
    @Before(Get.class)
    public void listPermission(Integer page, Integer pageSize) {
        success(permissionService.listPermissionService(getPage(page), getSize(pageSize)));
    }

    /***
     * 获取系统中所有的权限,用于授权管理使用
     *
     * @  权限集合
     */
    @Before(Get.class)
    public void allPermission() {
        success(permissionService.allPermissionService());
    }

    /***
     * 添加权限
     *
     * @param permission 权限对象
     * @  添加结果
     */
    @Before(Post.class)
    public void addPermission(@Para("") Permission permission) {
        boolean bool = permissionService.addPermissionService(permission);
        result(bool, "添加失败");
    }

    /**
     * 删除指定的权限
     *
     * @param id 权限的唯一ID
     * @ 删除结果
     */
    @Before(Delete.class)
    public void deletePermission(String id) {
        result(permissionService.deletePermissionService(id));

    }

    /**
     * 修改指定的权限
     *
     * @param permission 权限的对象
     * @ 修改
     */
    @Before(Put.class)
    public void updatePermission(@Para("") Permission permission) {
        result(permissionService.changePermissionService(permission));
    }

    // *************************菜单管理*************************

    /***
     * 分页的菜单列表
     *
     * @  返回分页列表信息
     */
    @Before(Get.class)
    public void listMenu(Integer page, Integer pageSize) {
        success(permissionService.listMenuService(getPage(page), getSize(pageSize)));
    }

    /**
     * 获取所有的一级菜单,用于添加二级菜单
     *
     * @ 返回所有的一级菜单
     */
    @Before(Get.class)
    public void fidMenu() {
        success(permissionService.fidMenuService());
    }

    /**
     * 获取所有的菜单,递归好的菜单,(用于添加权限的时候选择隶属菜单)
     *
     * @ 返回结果
     */
    @Before(Get.class)
    public void allMenu() {
        success(permissionService.allMenuService());
    }

    /***
     * 添加菜单
     *
     * @param menu 菜单对象
     * @  添加结果
     */
    @Before(Post.class)
    public void addMenu(@Para("") Menu menu) {
        result(permissionService.addMenuService(menu));
    }

    /**
     * 删除菜单
     *
     * @param id 菜单的唯一Id
     * @ 删除结果
     */
    @Before(Delete.class)
    public void deleteMenu(String id) {
        result(permissionService.deleteMenuService(id), "删除失败");

    }

    /**
     * 更新菜单信息
     *
     * @param menu 菜单对象
     * @ 返回更新结果
     */
    @Before(Put.class)
    public void updateMenu(@Para("") Menu menu) {
        result(permissionService.updateMenuService(menu));
    }

    // ******************************服务管理**************************

    /**
     * 全部服务列表
     *
     * @ 返回结果
     */
    @Before(Get.class)
    public void listService() {
        success(permissionService.listService());
    }

    /**
     * 添加服务
     *
     * @param service 服务对象
     * @ 返回添加结果
     */
    @Before(Post.class)
    public void addService(@Para("") Services service) {
        success(permissionService.addService(service));
    }

    /**
     * 修改服务层列表
     *
     * @param service 修改系统中的服务
     * @ 返回结果
     */
    @Before(Put.class)
    public void updateService(@Para("") Services service) {
        success(permissionService.updateService(service));
    }

    /**
     * 删除服务
     *
     * @param id id
     * @ 删除结果
     */
    @Before(Delete.class)
    public void deleteService(Integer id) {
        success(permissionService.deleteService(id));
    }
}
